//
//  main.cpp
//  opegGL-Line
//
//  Created by hoolai on 2017/9/1.
//  Copyright © 2017年 hoolai. All rights reserved.
//

//#include <iostream>
//#include <GLUT/GLUT.h>
//
//void display()
//{
//    //清空
//    glClear(GL_COLOR_BUFFER_BIT);
//    glBegin(GL_POLYGON);
//    glVertex2f(-0.5, -0.5);
//    glVertex2f(0, 0.5);
//    glVertex2f(0.5, -0.5);
//    glEnd();
//    glFlush();
//}
//
//int main(int argc, const char * argv[]) {
//    
//    glutInit(&argc, (char**) argv);
//    glutCreateWindow("Demo");
//    glutDisplayFunc(display);
//    glutMainLoop();
//    return 0;
//}

#include <stdio.h>
#include <GL/glew.h>
#include <GLUT/GLUT.h>
#include "math3d.h"

GLuint VBO;

/**
 * 渲染回调函数
 */
static void RenderScenceCB(){
    // 清空颜色缓存
    glClear(GL_COLOR_BUFFER_BIT);
    
    // 开启顶点属性
    glEnableVertexAttribArray(0);
    // 绑定GL_ARRAY_BUFFER缓冲器
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    // 告诉管线怎样解析bufer中的数据
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    
    // 开始绘制几何图形(绘制一个点)
    glDrawArrays(GL_POINTS, 0, 1);
    
    //  禁用顶点数据
    glDisableVertexAttribArray(0);
    
    // 交换前后缓存
    glutSwapBuffers();
}

/**
 * 创建顶点缓冲器
 */
static void CreateVertexBuffer()
{
    // 创建含有一个顶点的顶点数组
    Vector3f Vertices[1];
    // 将点置于屏幕中央
    Vertices[0] = Vector3f(0.0f, 0.0f, 0.0f);
    
    // 创建缓冲器
    glGenBuffers(1, &VBO);
    // 绑定GL_ARRAY_BUFFER缓冲器
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    // 绑定顶点数据
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
}

/**
 * 主函数
 */
int main(int argc, char ** argv) {
    
    // 初始化GLUT
    glutInit(&argc, argv);
    
    // 显示模式：双缓冲、RGBA
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    
    // 窗口设置
    glutInitWindowSize(480, 320);      // 窗口尺寸
    glutInitWindowPosition(100, 100);  // 窗口位置
    glutCreateWindow("Tutorial 02");   // 窗口标题
    
    // 开始渲染
    glutDisplayFunc(RenderScenceCB);
    
    // 检查GLEW是否就绪，必须要在GLUT初始化之后！
    GLenum res = glewInit();
    if (res != GLEW_OK) {
        fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
        return 1;
    }
    
    // 缓存清空后的颜色值
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    
    // 创建顶点缓冲器
    CreateVertexBuffer();
    
    
    // 通知开始GLUT的内部循环
    glutMainLoop();
    
    return 0;
}
